package com.woniu.springboot.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.woniu.springboot.component.MyLocaleResolver;
import com.woniu.springboot.interceptor.PermissionInterceptor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import javax.sql.DataSource;

/**
 * 全面扩展springMvc
 *  接口里面可以实现很多方法，视图解析器、拦截器、等等
 *  如果实现了这些方法，就表示手动接管，springboot则不会自动装配，而是按照手动配置的走
 *
 *  如果你想自定义一些自动装配的功能，只需要写这个组件，然后将他交给springboot，springboot就会帮我们自动装配
 */
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
    // -- 视图跳转
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("login");
        registry.addViewController("/login.html").setViewName("login");
        registry.addViewController("/main.html").setViewName("dashboard");
    }

    // -- 配置拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // -- new 自己创建的拦截器
        /*
           addInterceptor ：添加自己的拦截器
           excludePathPatterns ： 排除哪些不需要拦截的
           excludePathPatterns ：排除哪个静态资源
         */
        registry.addInterceptor(new PermissionInterceptor()).excludePathPatterns("/","/login.html","/login")
                .excludePathPatterns("/asserts/**");
    }

    // -- @Bean就代表在spring配置文件里面使用<bean>标签
    // -- 这个实例化接口名字必须和LocaleResolver接口名字一样，首字母小写
    @Bean
    public LocaleResolver localeResolver(){
        return new MyLocaleResolver();
    }

    // -- 实例化DataSource，连接数据库
    // -- 无论是Druid、还是C3P0都实现了DataSource这个接口
    @Bean
    @ConfigurationProperties(value = "spring.datasource")
    public DataSource dataSource(){
        // -- 这里return的是在yml配置文件中使用的Druid连接池的类
        return new DruidDataSource();
    }
}
